import URLS from './urlManage'
import {needToCheck,status,checkFun,HEADER,BASEURLS}  from './config'
import db from '../db/index'
let runList = [] // 正在进行中的接口
let header = HEADER
let hascheck = false
// 校验接口是否合法
const http = (api, options = {}) => {
  // 判断是否是有效接口地址
  if(URLS[api] != undefined){
    // 判断是否是有效访问方式
    let data = JSON.parse(JSON.stringify(URLS[api]))
    data.data = options;
    data.api = api
    data.url = BASEURLS[db.getState().system.envVersion][data.url[0]] + data.url[1]
    feeling(data,'add')
    if(needToCheck && !URLS[api].noCheck){
      return checkout(data)
    }else{
      return adaptive(data)
    }
  }else{
    console.error(api+'不合法')
  }
}
//校验是否有token
const checkout = (data)=>{
  if(hascheck){ // 已经有取过新的header验证条件了
    return adaptive(data)
  }else{
    return new Promise((resolve, reject)=>{
      checkFun().then((res)=>{ // 没有取过新的验证条件，则会去取
        header = {
          ...header,
          ...res
        }
        hascheck = true 
        adaptive(data).then((res)=>{
          resolve(res)
        }).catch((res)=>{
          reject(res)
        })
      })
    })
  }
}
// 配置参数
const adaptive = (data)=>{
  switch (data.method){
    case 'GET':
      if(typeof(data.data) != 'object' && data.data != undefined  && data.data != ''){
        data.url += '/'+data.data
      }
      break
    case 'POST':
      data.header = header
      break
  }
  return request(data)
}
//发送请求处理请求后的返回值
const request = function (data) {
  return new Promise(
    function(resolve, reject){
      data.success = (res)=>{
        // 返回值在这里处理
        res = res.data
        if(res.status == status.ISNOTOKEN){ //当没有token 时
          hascheck = false
          resolve(checkout(data))
        }
        feeling(data,'del')
        if(res.status == status.ISOK){ // 成功取到
          resolve(res.data)
        }
        // 其他错误
        reject(res)
      }
      data.fail = (res)=>{
        console.error(`接口请求失败，请查看NetWork,接口${data.url}`) 
      }
      data.url += '?v='+new Date().getTime() // 给访问接口一个随机参
      uni.request(data);
    }
  )
}
// 是否显示 loading 
const feeling = (data,type)=>{
  let api = data.api
  if(type === 'add') { 
    if(!data.noFeeling) runList.push(api)
    if(runList.length > 0 ){
      uni.showLoading({
        title: "加载中...",
      })
    }
  }
  if(type === 'del') {
    runList.splice(runList.indexOf(api),1)
    if(runList.length == 0 ){
      uni.hideLoading({
        title: "加载中...",
      })
    }
  }
}
export default http